<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<link href="../css/style.css" rel="stylesheet" type="text/css">
</head><body>
<h1>3.4. Форматы команд</h1>
<p class="article">
Команды i8086 имеют переменную длину от 1 до 6 байт. По числу обрабатываемых 
операндов команды подразделяются на безадресные, одноадресные и двухадресные. 
В двухадресных командах результат всегда записывается по первому адресу и только 
один из операндов может находиться в памяти. При этом в мнемонике, операнд-приемник 
записывается слева от запятой-разделителя операндов, а операнд-источник – справа.
Всего существует четыре источника операндов: тело команды, регистр, память и порт 
ввода/вывода. В первом случае операнд называется непосредственным.
</p>
<p class="article">
Первый байт команды содержит код операции (КОП), в состав которого могут входить 
специальные разряды d, s и w. При w=1 операции выполняются с 16-разрядными 
словами, при w=0 – с байтами. Разряд d определяет направление передачи данных в 
двухоперандных командах: из регистра в регистр/память (d=0) или из регистра/памяти 
в регистр (d=1). S – определяет расширение 8-битных непосредственных данных до 
полного размера (s=1) или нет (s=0). При некоторых сочетаниях команд и методов 
адресации (регистровый метод адресации) положение операнда может задаваться 
непосредственно в байте кода операции (см. следующий раздел), но чаще для этого 
используется т.н. «постбайт».
</p>
<p class="article">
В командах, имеющих длину 2 и более байта, второй байт называется постбайтом. 
Он выполняет функции кодирования адресов операндов. Байты 3 - 6 присутствуют в 
команде в зависимости от типа адреса операнда, описанного постбайтом и наличия непосредственного операнда.
</p>
<p class="article">
Постбайт состоит из трех полей: режима - MOD, регистра - REG и регистра/памяти - 
R/M. Поле MOD занимает 2 бита (6 и 7) постбайта. Поле REG занимает 3 бита (3-5) 
постбайта. Поле R/M занимает 3 бита (0-2) постбайта. Полями MOD и R/M совместно кодируется тип адреса операнда, 
находящегося в памяти или регистре. 32 значения этих полей определяют 
нахождение операнда 24 возможными методами адресации либо в одном 
из 8 регистров. 
</p>
<p class="article">
Ниже приведена структура байта кода операции и постбайта, а в таблицах показано формирование адресов регистровых  операндов и адресов 
операндов памяти. DISP8 и DISP16 – смещения длиной 8 и 16 бит, расположенные в команде непосредственно за байтом  адресации.
</p>
<div class="image">
	<img src="../img/byte_format.png" />
	<p>Формат байта КОП и постбайта</p>
</div>
<table border="1px" cellspacing="0" cellpadding="1px">
	<tr>
		<td>Поле REG</td>
		<td>W=1</td>
		<td>W=0</td>
		<td>Сегментные регистры</td>
	</tr>
	<tr>
		<td>000</td>
		<td>AX</td>
		<td>AL</td>
		<td>ES</td>
	</tr>
	<tr>
		<td>001</td>
		<td>CX</td>
		<td>CL</td>
		<td>CS</td>
	</tr>
	<tr>
		<td>010</td>
		<td>DX</td>
		<td>DL</td>
		<td>SS</td>
	</tr>
	<tr>
		<td>011</td>
		<td>BX</td>
		<td>BL</td>
		<td>DS</td>
	</tr>
	<tr>
		<td>100</td>
		<td>SP</td>
		<td>AH</td>
		<td> - </td>
	</tr>
	<tr>
		<td>101</td>
		<td>BP</td>
		<td>CH</td>
		<td> - </td>
	</tr>
	<tr>
		<td>110</td>
		<td>SI</td>
		<td>DH</td>
		<td> - </td>
	</tr>
	<tr>
		<td>111</td>
		<td>BI</td>
		<td>DH</td>
		<td> - </td>
	</tr>
</table>
<p class="article">
&nbsp;
</p>
<table border="1px" cellspacing="0" cellpadding="1px">
	<tr>
		<td>MOD</td>
		<td>R/M</td>
		<td>Базовый регистр</td>
		<td>Эффективный адрес</td>
		<td>Длинна команды</td>
	</tr>
	<tr>
		<td>00</td>
		<td>000</td>
		<td>DS</td>
		<td>[BX+SI]</td>
		<td>2</td>
	</tr>
	<tr>
		<td>00</td>
		<td>001</td>
		<td>DS</td>
		<td>[BX+DI]</td>
		<td>2</td>
	</tr>
	<tr>
		<td>00</td>
		<td>010</td>
		<td>SS</td>
		<td>[BP+SI]</td>
		<td>2</td>
	</tr>
	<tr>
		<td>00</td>
		<td>011</td>
		<td>SS</td>
		<td>[BP+DI]</td>
		<td>2</td>
	</tr>
	<tr>
		<td>00</td>
		<td>100</td>
		<td>DS</td>
		<td>[SI]</td>
		<td>2</td>
	</tr>
	<tr>
		<td>00</td>
		<td>101</td>
		<td>DS</td>
		<td>[DI]</td>
		<td>2</td>
	</tr>
	<tr>
		<td>00</td>
		<td>110</td>
		<td>DS</td>
		<td>DISP16</td>
		<td>4</td>
	</tr>
	<tr>
		<td>00</td>
		<td>111</td>
		<td>DS</td>
		<td>[BX]</td>
		<td>2</td>
	</tr>
	<tr>
		<td>01</td>
		<td>000</td>
		<td>DS</td>
		<td>DISP8+[BX+SI]</td>
		<td>3</td>
	</tr>
	<tr>
		<td>01</td>
		<td>001</td>
		<td>DS</td>
		<td>DISP8+[BX+DI]</td>
		<td>3</td>
	</tr>
	<tr>
		<td>01</td>
		<td>010</td>
		<td>SS</td>
		<td>DISP8+[BP+SI]</td>
		<td>3</td>
	</tr>
</table>

<p class="article">
Команде может предшествовать префикс – байт со специальным кодированием, 
которое изменяет операцию следующей за ним команды. В системе команд процессоров 
8086/8088 есть два таких префикса – REP (REPeat) для повторения команд обработки 
строк и SEG (SEGment) для прямого указания команде сегментного регистра вместо 
регистра, используемого по умолчанию.
</p>
</body></html>
